Programming Blackwell Tensor Cores with CuTe and CUTLASS

Cris Cecka, Mike Rubbelke (NVIDIA GTC | March 21, 2024)

目录

什么是 CUTLASS?

CUTLASS 是一个用于在各种规模和尺寸上进行密集计算的 CUDA C++ 模板库。

NVIDIA Blackwell 架构

Blackwell 硬件新特性概览:

  1. Blackwell Tensor Cores - 支持 FP4/FP6 数据类型
  2. Tensor Memory (TMEM) - 张量内存
  3. 新的调度能力
NVIDIA GB200 Superchip (Page 4)
NVIDIA GB200 Superchip (Page 4)

1. Blackwell Tensor Cores

从 Hopper 到 Blackwell 的演进

Blackwell Tensor Cores 相比 Hopper 实现了显著的性能和功能提升:

下表对比了 Hopper 和 Blackwell 在 Tensor Core 操作上的主要区别:

阶段 Hopper Blackwell
操作数加载 从寄存器加载 从张量内存加载
累加 寄存器 张量内存
指令发布 等待组内指令完成 异步执行,与 Epilogue 重叠
指令完成 同步提交 同步提交
Hopper 与 Blackwell Tensor Cores 对比 (Page 5)
Hopper 与 Blackwell Tensor Cores 对比 (Page 5)

扩展 Tensor Core 指令至 2 个 SM

Blackwell 架构将单个 Tensor Core 指令的执行范围扩展到了 2 个流式多处理器(SM)。

扩展 Tensor Core 指令至 2 个 SM 的架构图 (Page 6)
扩展 Tensor Core 指令至 2 个 SM 的架构图 (Page 6)

支持新的块缩放数据格式(Block-scaled Formats)

Blackwell Tensor Core 硬件原生支持新的块缩放数据类型:MXFP8、MXFP6、MXFP4 和 MXINT8。

新数据格式支持示意图 (Page 7)
新数据格式支持示意图 (Page 7)

下表总结了新的块缩放格式:

格式名称 数据格式 缩放格式 可用于
MXFP8 FP8 E5M2 或 E4M3 FP32 或 None A, B, C, D
MXFP6 FP6 E3M2 FP32 或 None A, B, C, D
MXFP4 FP4 E2M1 FP32 或 None A, B, C, D
MXINT8 INT8 FP32 A, B

2. Blackwell Tensor Memory (TMEM)

TMEM 是每个 SM 上的内联内存,专用于 Tensor Core 的操作数输入和输出。

Blackwell Tensor Memory (TMEM) 结构 (Page 9)
Blackwell Tensor Memory (TMEM) 结构 (Page 9)

3. 新的调度能力

首选线程块集群 (Preferred Thread Block Clusters)

不同线程块集群配置示意图 (Page 11)
不同线程块集群配置示意图 (Page 11)

运行时持久调度 (Runtime Persistent Scheduling)

静态分块调度 (Static Tile Scheduling)

这是 CUTLASS 在 Hopper 架构上使用的持久化调度方法。

静态调度的问题示意图 (Page 12)
静态调度的问题示意图 (Page 12)
动态分块调度 (Dynamic Tile Scheduling)

Blackwell 架构引入了新的硬件功能来解决静态调度的问题。
- 机制: Blackwell 允许用户在 SM 上通过 cuda::cluster_arrive_relaxed::fetch_add 指令以编程方式获取新的线程块集群。
- CUTLASS 实现: CUTLASS 利用此功能实现了动态持久化调度器(Dynamic Persistent Scheduler)。
- 输出分块到 SM 的映射是完全动态的,取决于各个 SM 的执行进度。当一个 SM 完成其任务后,它会主动获取新的任务。
- 这是 CUTLASS 在 Blackwell 上的默认调度器

动态调度的优势示意图 (Page 13)
动态调度的优势示意图 (Page 13)

Blackwell 架构特性总结

Blackwell 架构特性总结 (Page 14)
Blackwell 架构特性总结 (Page 14)

使用 CuTe 针对 Blackwell 新特性进行编程

本章介绍如何使用 CuTe 库来为 NVIDIA Blackwell 架构的新特性进行编程,主要内容包括:

使用 Blackwell Tensor Core 编程 (MMA)

Blackwell Tensor Cores: CuTe Atoms

CuTe 的 MMA 原子操作 (atom) 为使用 MMA (Matrix Multiply-Accumulate) 提供了 PTX (Parallel Thread Execution) 和元数据。

Page 19
Page 19

Hopper 与 Blackwell 的区别


Blackwell TiledMMA: CuTe Atoms

用户选择一个 MMA_Op 来创建一个 TiledMMA。CuTe 为每个 M100 Tensor Core 指令都提供了相应的 TiledMMA

下图展示了如何从一个 MMA_Op 构建 TiledMMA,它描述了 CTA 级别的计算分块。右侧的代码示例演示了如何用指定的 MMA_Atom 和操作数布局来创建一个 TiledMMA

Page 20
Page 20

Blackwell MMA GEMM 示例

这是一个完整的通用矩阵乘法(GEMM)示例,展示了从数据布局到计算执行的完整流程。

1. 在全局内存中表示张量

首先,定义输入矩阵 A、B 和输出/累加矩阵 C 在全局内存(Global Memory)中的布局。
- 矩阵 A: (M, K)
- 矩阵 B: (K, N)
- 矩阵 C: (M, N)
Page 21

2. 创建分区视图

使用 Tile 来创建全局内存张量的分区视图。在 Blackwell 架构中,我们使用 mma_tiler 而不是 Hopper 中常用的 cta_tiler。这个 tiler 定义了计算任务如何在 CTA 网格上进行划分。
Page 22

3. 切分张量

根据 global_coord(而不是 cta_id)从分区视图中为每个 CTA 切分出对应的数据块。这一步确定了每个 CTA 需要处理的 A、B 和 C 矩阵的具体部分。
Page 23

4. 在 CTA 间划分 MMA Tiles

使用 TiledMma 对象来将整个 MMA 计算任务在不同的 CTA 之间进行划分。这决定了每个 CTA 内部线程块的计算范围和数据分工。
Page 24

5. 创建 SMEM 布局并分配共享内存

为 CTA 本地的数据(A 和 B 的分块)创建共享内存(Shared Memory, SMEM)布局,并分配相应的内存空间。数据将从全局内存加载到共享内存,以供 Tensor Core 高效访问。
Page 25

6. 创建 MMA 片段 (Fragments)

为 MMA 操作创建寄存器级别的 "Fragments"。这些 Fragments 是 MMA 指令直接消耗的数据单元,代表了将从共享内存加载到寄存器的数据。
Page 26

7. 协同拷贝 (GMEM -> SMEM)

使用 cooperative_copy 将数据从全局内存(GMEM)异步拷贝到共享内存(SMEM)。这是一个协同操作,由 CTA 内的所有线程共同完成。
Page 27

8. 执行 MMA (SMEM -> REG)

最后,执行 gemm 操作。数据从共享内存加载到寄存器(Fragments),然后由 Tensor Core 执行矩阵乘加运算,结果累加到 C 的 Fragments 中。
Page 28

使用 TMA (Tensor Memory Accelerator)

TMA 是用于高效数据传输的硬件单元。

TMA Atom

CuTe 的 TMA 原子操作为使用 TMA 提供了 PTX 和元数据支持。

以下是 TMA_OpCopy_Atom 的代码示例:

Page 30
Page 30

Blackwell MMA+TMA GEMM: 使用 TMA

为了在 Blackwell 架构上利用张量内存加速器(TMA)进行通用矩阵乘法(GEMM),我们需要对现有的基于全局内存(GMEM)和共享内存(SMEM)的 GEMM 核函数进行修改。

Page 31: 展示了从全局内存 A 和 B 加载数据,通过 SMEM 进入寄存器进行 MMA 运算,并将结果 C 写回全局内存的基本 GEMM 流程。右侧代码显示了全局内存张量 gA 的初始定义。
Page 31: 展示了从全局内存 A 和 B 加载数据,通过 SMEM 进入寄存器进行 MMA 运算,并将结果 C 写回全局内存的基本 GEMM 流程。右侧代码显示了全局内存张量 gA 的初始定义。
1. 使用 TMA 感知的全局内存张量

第一步是修改全局内存张量的定义方式。标准的 cute::make_tensor 用于创建通用张量视图。为了让 TMA 能够识别和处理这些张量,我们需要使用一个专门的构造函数 cute::make_tma_tensor。此函数位于 cute/tensor_map.hpp 中,它会为张量附加必要的信息,以便 TMA 硬件能够正确地执行加载操作。

Page 32: 将代码中 gA 和 gB 的定义从 make_tensor 更改为 make_tma_tensor。
Page 32: 将代码中 gA 和 gB 的定义从 make_tensor 更改为 make_tma_tensor。
2. TMA 分区与同步

定义了 TMA 张量后,下一步是规划数据加载。

通过这些修改,原有的 copy(gA, tAgA, ...) 操作被替换为 copy(tma_load_a, ...),并配合同步原语,从而将数据加载任务卸载到 TMA 硬件上。

Page 33: 代码高亮显示了 TMA 分区和 TMA 屏障的创建,以及在循环中使用 tma_arrive_and_wait 进行同步。
Page 33: 代码高亮显示了 TMA 分区和 TMA 屏障的创建,以及在循环中使用 tma_arrive_and_wait 进行同步。

使用 MMA.2SM 和 TMA.2SM

Blackwell 架构引入了 .2sm 后缀的指令,允许单个 MMA(矩阵乘法累加)或 TMA 操作跨越两个流式多处理器(Streaming Multiprocessors, SMs)执行。这使得两个协作的 CTA(Cooperative Thread Array)可以共同处理一个更大的计算任务。

Page 34: Programming Blackwell Features using CuTe 目录页,当前进入第三个特性:使用 MMA.2SM 和 TMA.2SM。
Page 34: Programming Blackwell Features using CuTe 目录页,当前进入第三个特性:使用 MMA.2SM 和 TMA.2SM。

CuTe MODE 原子操作

CuTe 通过其“原子操作”(Atoms)抽象来支持这些新的硬件特性。

Page 35: 左侧图示了 MMA.1SM 和 MMA.2SM 的拓扑结构,右侧代码高亮了通过 SmShape = Shape<_2,_1> 定义 2-SM MMA Atom。
Page 35: 左侧图示了 MMA.1SM 和 MMA.2SM 的拓扑结构,右侧代码高亮了通过 SmShape = Shape<_2,_1> 定义 2-SM MMA Atom。
Page 36: 左图展示了 TMA tile 如何被分割并分发到 SM0 和 SM1。右侧代码展示了 make_tma_copy 如何使用 CtaSchd 和 Multicast 参数来定义 TMA.2SM 操作。
Page 36: 左图展示了 TMA tile 如何被分割并分发到 SM0 和 SM1。右侧代码展示了 make_tma_copy 如何使用 CtaSchd 和 Multicast 参数来定义 TMA.2SM 操作。

内核修改

为了在 GEMM 内核中启用 2-SM 操作,需要进行以下修改:

  1. 使用 blockIdx.z 进行 SM 映射:
    CUDA grid 的 Z 维度(blockIdx.z)现在被用作 SM 集群内的索引。例如,对于一个 2-SM 操作,cta_id_z 为 0 的 CTA 运行在一个 SM 上,cta_id_z 为 1 的 CTA 运行在另一个协作的 SM 上。

  2. Leader CTA:
    集群中的一个 CTA(通常是 cta_id_z == 0 的那个)被指定为 "leader"。is_leader 变量用于识别 leader CTA。

    Page 38: 左图展示了 cta_id_z 如何用于在两个 CTA 之间划分工作。右侧代码高亮了 cta_id_z 的获取和 is_leader 的判断。
    Page 38: 左图展示了 cta_id_z 如何用于在两个 CTA 之间划分工作。右侧代码高亮了 cta_id_z 的获取和 is_leader 的判断。
  3. 调度与同步:

    • 核心的 cute::gemm 计算循环仅由 leader CTA 执行。
    • 必须在关键节点插入 cute::cluster_sync(),这是一个新的同步原语,用于同步集群内所有协作的 CTAs。
    Page 39: 左图展示了 2-SM GEMM 的数据流,其中两个 CTA 协同工作。右侧代码展示了 gemm 调用被 if(is_leader) 包裹,并引入了 cluster_sync() 进行同步。
    Page 39: 左图展示了 2-SM GEMM 的数据流,其中两个 CTA 协同工作。右侧代码展示了 gemm 调用被 if(is_leader) 包裹,并引入了 cluster_sync() 进行同步。

TMEM 累加器与 Epilogue

Blackwell 架构引入了张量内存(Tensor Memory, TMEM),这是一个由 warp 寻址的、显式管理的内存空间,旨在作为寄存器和共享/全局内存之间的高效数据交换媒介,特别适用于 GEMM 的 Epilogue(收尾)阶段。

Page 40: Programming Blackwell Features using CuTe 目录页,当前进入第四个特性:TMEM 累加器。
Page 40: Programming Blackwell Features using CuTe 目录页,当前进入第四个特性:TMEM 累加器。

TMEM 硬件与 PTX

Page 41: 左侧描述了 TMEM 的硬件特性和 PTX 指令,右侧图表展示了 TMEM 对不同 warp 组的访问权限。
Page 41: 左侧描述了 TMEM 的硬件特性和 PTX 指令,右侧图表展示了 TMEM 对不同 warp 组的访问权限。

TMEM 软件接口与操作

Page 42: 左侧描述了 TMEM 的软件接口和指令,右侧图示了 tmem.load 和 tmem.store 的工作方式,强调了其集体性和固定模式。
Page 42: 左侧描述了 TMEM 的软件接口和指令,右侧图示了 tmem.load 和 tmem.store 的工作方式,强调了其集体性和固定模式。

CuTe 对 TMEM 的抽象

CuTe 为 TMEM 提供了高层抽象,简化了其使用:
- Copy_AtomTiledCopy: CuTe 提供了用于 TMEM 的原子操作和 TiledCopy 特性,封装了 TMEM 的布局和复制逻辑。
- TmemTensor 创建: 可以使用 make_fragment_A, _B, _C 等函数创建与 MMA 操作布局一致的 TmemTensor
- TiledCopy 创建: make_tiled_copy 函数可以基于 TmemTensor 创建一个 TiledCopy 对象,用于执行实际的数据传输。

Page 43: 左侧介绍了 CuTe 为 TMEM 提供的抽象,右侧代码片段展示了如何定义 TMEM 的 Copy_Atom、TiledCopy_Atom 以及如何创建 TmemTensor 和 TiledCopy 对象。
Page 43: 左侧介绍了 CuTe 为 TMEM 提供的抽象,右侧代码片段展示了如何定义 TMEM 的 Copy_Atom、TiledCopy_Atom 以及如何创建 TmemTensor 和 TiledCopy 对象。

CuTe TMEM Epilogue 示例

以下步骤展示了如何在 GEMM epilogue 中使用 TMEM 将累加器中的结果(矩阵 C)写回到全局内存(矩阵 D),同时可能进行量化等操作。

  1. 准备阶段:

    • 首先,像往常一样计算出线程块的坐标和线程索引。
    Page 44: 左图展示了 A, B, C 矩阵的分区,右侧为内核的初始设置代码。
    Page 44: 左图展示了 A, B, C 矩阵的分区,右侧为内核的初始设置代码。
  2. 分区与张量创建:

    • 获取输出张量的局部视图: 使用 local_tile 从全局输出张量 D_Global 中划分出当前 CTA 负责的局部视图 D_local
    • 创建 TMEM 张量: 使用 make_fragment_C 将存储在寄存器中的累加器 rC 转换为一个 TMEM 张量 tC。这一步是逻辑上的转换,它为寄存器数据赋予了 TMEM 的布局信息,为后续的物理拷贝做准备。
    Page 45: 左图展示了如何从全局 D 中获取局部 D_local,以及如何创建 TmemTensor_C。右侧代码高亮了 local_tile 和 make_fragment_C 的调用。
    Page 45: 左图展示了如何从全局 D 中获取局部 D_local,以及如何创建 TmemTensor_C。右侧代码高亮了 local_tile 和 make_fragment_C 的调用。

接下来的步骤将是使用 cute::copy 指令,通过先前定义的 TiledCopy 对象,将寄存器中的 rC 复制到 TMEM,然后再从 TMEM 复制到全局内存的 D_local 中。TMEM 在此过程中充当了一个高性能的暂存区。

使用 CUTLASS 适配 Blackwell 新特性

本章介绍如何利用 CUTLASS 库来充分发挥 Blackwell 架构的新特性。

CuTe 与 CUTLASS 3.x 概念层级

CUTLASS 3.x 建立在一个分层的概念体系之上,底层是 CuTe 库,提供了对硬件指令的精细控制,顶层则提供了高生产力的编程接口。

Page 52: CuTe 与 CUTLASS 3.x 概念层级图
Page 52: CuTe 与 CUTLASS 3.x 概念层级图

支持众多 Kernel 变体

CUTLASS 的设计目标之一是支持大规模的 Kernel 组合,以应对不同的算法、数据类型、数据布局和性能优化选项。这导致了数百种不同的 Kernel 变体。

Page 51: 展示 CUTLASS 支持的各种 Kernel 变体组合
Page 51: 展示 CUTLASS 支持的各种 Kernel 变体组合

CUTLASS Kernel 示例:从 Hopper 到 Blackwell

构建一个 CUTLASS Kernel 通常遵循以下三个步骤:
1. 选择 Mainloop: 定义核心的 MMA 计算以及输入数据的流入方式。这通过 CollectiveMainloop 来实现。
2. 选择 Epilogue: 定义如何对 MMA 的输出进行后处理。这通过 CollectiveEpilogue 来实现。
3. 组合成 Kernel: 使用调度策略将 Mainloop 和 Epilogue 组合在一起,形成 内核层 (Kernel Layer)

Page 67: CUTLASS内核示例,展示了将主循环和收尾组合成一个完整内核的第三步。
Page 67: CUTLASS内核示例,展示了将主循环和收尾组合成一个完整内核的第三步。

将一个为 Hopper (SM90) 架构编写的 CUTLASS Kernel 迁移到 Blackwell (SM100) 架构非常直接,主要涉及以下修改:

  1. 更改架构标签: 将 ArchTagcutlass::arch::Sm90 修改为 cutlass::arch::Sm100_...
  2. 更新调度策略: 将 DispatchPolicy 从 Hopper 的 ...Sm90TmaGmma... 修改为 Blackwell 的 ...Sm100TmaWgmma...,以使用 Blackwell 引入的 Warp-Group MMA (WGMMA) 指令。
  3. 调整 Tile 形状: TileShape 可能需要从基于 CTA 的定义调整为基于 MMA 的定义,以更好地匹配新硬件的特性。
Page 57: 从 Hopper 到 Blackwell 的代码修改示例
Page 57: 从 Hopper 到 Blackwell 的代码修改示例

如代码高亮所示,迁移工作主要集中在修改几个关键的类型别名(using 声明),而 Kernel 的主体逻辑保持不变。

Collective Mainloop 与 Builder

// 使用 CollectiveBuilder 简化 Mainloop 的定义
using Mainloop = typename CollectiveBuilder<
    cutlass::arch::Sm100,
    cutlass::gemm::MainloopSm100TmaWgmmaFp16Crosswise,
    Shape<_128, _128, _32>, // TileShape_MNK
    /* ... other params ... */
>::CollectiveType;

为 Blackwell 设计的新集合 (New Collectives for Blackwell)

为支持新的硬件特性,CUTLASS 提供了新的 Collectives 和 Mainloop 实现。

Blackwell 架构引入了新的 WGMMA 指令,所有的 Mainloop 都基于 TmaWGMMA。CUTLASS 为此提供了新的 Collectives,以支持不同规模的 MMA 操作。
- 非线程块级 MMA (Per-Warp): 适用于 MMA 计算在单个 Warp 内部完成的场景。这通过使用 MainloopSm100TmaWgmma*PerWarp* 调度策略来实现。
- 线程块级 MMA (Block-wide/Crosswise): 适用于需要整个线程块协作完成的更大规模 MMA 计算。这通过使用 MainloopSm100TmaWgmma*Crosswise* 调度策略来实现。

CUTLASS 3.6 预调优了以下集合:
- 针对非块缩放 MMA 的带有 TMA 加载的密集 GEMM
- MainloopSm90TmaGmmaRmemAsync

Page 62: 为Blackwell设计的新集合,增加了更多集合类型,包括卷积和模拟FP32 GEMM。
Page 62: 为Blackwell设计的新集合,增加了更多集合类型,包括卷积和模拟FP32 GEMM。

新的主循环构建器特性 (New Mainloop Builder Features)

运行时 - 首选线程块集群 (Runtime - Preferred Thread Block Clusters)

运行时数据类型 (Runtime Data Types)
- 支持将数据类型作为运行时参数指定给内核。
- 无需为具有相同位宽但类型不同的参数(例如 s4u4)编译单独的内核,两者都由 cute::uint_sub_byte_t 分派。

Page 63: 新的主循环构建器特性,代码示例高亮了在运行时指定集群形状(ClusterShape)和数据类型(e.g., ProblemSize<uint4b_t>)。
Page 63: 新的主循环构建器特性,代码示例高亮了在运行时指定集群形状(ClusterShape)和数据类型(e.g., ProblemSize<uint4b_t>)。

Collective Epilogue 与 Builder

Collective Epilogue
- 使用 cute::Tensor 进行灵活的输出后处理。
- Hopper 支持基于 TMA 的收尾(Sm90Tma)。
- Blackwell 完全支持 bfloat 类型和基于 TMT 的收尾。

Collective Builder
- 基于问题大小、设备、切片形状和数据并行策略,在运行时选择最优的集合。
- 调度内部的启发式方法 (Heuristics)。

Page 65: 集合收尾与构建器,代码示例展示了CollectiveEpilogue的定义以及Builder根据不同条件选择不同实现(如Sm90Tma、Sm100Tmt)的逻辑。
Page 65: 集合收尾与构建器,代码示例展示了CollectiveEpilogue的定义以及Builder根据不同条件选择不同实现(如Sm90Tma、Sm100Tmt)的逻辑。

为 Blackwell 设计的新的预调优集合收尾

为 Blackwell 架构引入了新的收尾(epilogue)实现,这些实现从 TMAadaptor::CUT 进行了重构。

Page 66: 为 Blackwell 设计的新的预调优集合收尾。
Page 66: 为 Blackwell 设计的新的预调优集合收尾。

Blackwell TMEM Epilogue (收尾阶段)

Blackwell 架构引入了张量内存 (TMEM) 来优化 Epilogue 阶段的操作。该流程旨在将累加器中的数据高效地写回全局内存 (GMEM)。

1. 累加器作为起点

Epilogue 流程的输入是 MMA 计算完成后存储在寄存器中的累加器 tC(D)

Page 46: Blackwell TMEM Epilogue 流程图,高亮累加器部分
Page 46: Blackwell TMEM Epilogue 流程图,高亮累加器部分
// 为累加器定义一个 Gmem 布局
auto tC_gmem = make_tensor(make_gmem_ptr(C), LayoutC{});

2. 创建 TMEM 拷贝操作

为了将累加器的数据输出到 GMEM,需要创建一个 TmaCopy 对象来管理通过 TMEM 进行的数据传输。

Page 47: Blackwell TMEM Epilogue 流程图,高亮从累加器到 TMEM 的拷贝路径
Page 47: Blackwell TMEM Epilogue 流程图,高亮从累加器到 TMEM 的拷贝路径
// 1. 创建一个 TmaCopy 对象
auto gmem_tma = make_tma_copy(
    TmaMode{},
    tC_gmem);

// 2. 获取一个用于存放 TmaCopy 输入数据的 Fragment
auto tC_frg = make_fragment(tC_acc, tile_shape_MN);

3. TMEM 目标分区

在执行拷贝之前,需要根据线程索引对目标 GMEM 张量进行分区,以确保每个线程正确写入其负责的数据块。

Page 48: Blackwell TMEM Epilogue 流程图,展示累加器被分区
Page 48: Blackwell TMEM Epilogue 流程图,展示累加器被分区
// 3. 对 Gmem 张量进行分区
auto tC_gmem_part = partition_C(gmem_tma, thread_idx);

4. 执行到 GMEM 的拷贝

最后,调用 copy 函数,将累加器片段中的数据通过 TMEM 异步拷贝到已分区的 GMEM 目标位置。

Page 49: Blackwell TMEM Epilogue 流程图,高亮从 TMEM 到 HBM 的最终拷贝路径
Page 49: Blackwell TMEM Epilogue 流程图,高亮从 TMEM 到 HBM 的最终拷贝路径
// 4. 将累加器片段拷贝到已分区的 Gmem 目标
copy(gmem_tma, tC_gmem_part, tC_frg);

CUTLASS 内核层 (CUTLASS Kernel Layer)

内核层将所有组件(主循环、收尾)整合在一起。

Page 70: CUTLASS内核层,描述了内核结构,代码高亮了KernelTmaWarpSpecialized和KernelTmaWarpSpecializedCooperative两种内核特化。
Page 70: CUTLASS内核层,描述了内核结构,代码高亮了KernelTmaWarpSpecialized和KernelTmaWarpSpecializedCooperative两种内核特化。

Warp 专用持久化内核 - Hopper vs Blackwell 对比

该图对比了 Hopper 和 Blackwell 架构在 Warp 专用持久化内核上的执行模型。

Page 71: Hopper与Blackwell的Warp专用内核执行模型对比图。Hopper采用乒乓机制在同一线程上交错执行MMA和Epilogue,而Blackwell则在不同线程上并发执行,实现真正的重叠。
Page 71: Hopper与Blackwell的Warp专用内核执行模型对比图。Hopper采用乒乓机制在同一线程上交错执行MMA和Epilogue,而Blackwell则在不同线程上并发执行,实现真正的重叠。

结论与未来路线图

CUTLASS 3.8 新特性

为 Blackwell 提供了全面的高性能支持。

特性 (Features):

内核 (Kernels):
- 适用于所有 Hopper 类型的密集 GEMM 内核(FP32、TF32、FP16、BF16、FP8),性能比 Hopper 提升 2 倍。
- 适用于新 Hopper 数据类型的密集 GEMM 内核(benchmarking a la fp6/fp4),性能比 Hopper 提升高达 4 倍。
- 适用于所有 Hopper 类型的密集隐式 GEMM 卷积内核(FP32、TF32、FP16、BF16、FP8),性能比 Hopper 提升 2 倍。
- 使用 Blackwell Tensor Cores 的分组 GEMM 内核,支持块缩放类型。
- 使用 M16 矩阵的模拟 FP32 内核,利用 Blackwell Tensor Cores。

Page 73: CUTLASS 3.8 新特性总结。
Page 73: CUTLASS 3.8 新特性总结。

2025 年规划

CUTLASS 4.x - 将 CUTLASS 设备级与 Python 互操作性结合

CUTLASS C++
- 关键特性
- 使用 Blackwell Tensor Cores 的 Blackwell 专用稠密 GEMM 内核。
- Blackwell fp4/fp6 支持,完全与 cuBLASLt 早期版本对齐。
- Blackwell INT2/INT1 支持,带有新的 MINT 块缩放 GEMM。
- 稀疏性支持:建立在 fp4/fp6 块缩放 GEMM、INT2/INT1cuSPARSELt 之上。

Page 74: 2025年规划,包括CUTLASS 4.x和C++的未来特性。
Page 74: 2025年规划,包括CUTLASS 4.x和C++的未来特性。

致谢

向以下社区和开发者致谢:

Page 75: 致谢页面。
Page 75: 致谢页面。